package book.controller;

import book.contant.SessionContent;
import book.enums.ResultStatus;
import book.model.*;
import book.service.BookService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.awt.print.Book;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * controller: 作用 :对参数进行操作,
 * 参数校验,结果处理
 */
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private BookService bookService;

    /**
     * 添加图书信息
     * @param bookInfo
     * @return 添加成功 返回true,失败返回false
     */
    @RequestMapping(value="/add",produces="application/json")
    public Boolean addBook(BookInfo bookInfo){
        //数据校验:
//        打印日志: 双引号加上一个{},相当于占位符,会将要打印的信息填充到{}所在的位置
        log.info("添加图书,接收到的参数:{}",bookInfo);
        if(!StringUtils.hasLength(bookInfo.getBookName())||
            !StringUtils.hasLength(bookInfo.getAuthor())||
            bookInfo.getCount()==null ||
            bookInfo.getPrice()==null||
            !StringUtils.hasLength(bookInfo.getPublish())||
            bookInfo.getStatus()==null){
            return false;
        }
        //调用服务层:
        try {
            //可能产生异常
            Integer i = bookService.addBook(bookInfo);
            if(i>0){
                return true;
            }
        }catch (Exception e){
//      打印异常信息,方便定位问题 :
//            打印异常一般不添加{},因为异常为堆栈信息,{}不起作用,会原样打印出来.
            log.error("添加图书异常: e",e);
        }
        return false;
    }
    /**
     * 接收前端请求,对请求处理,并返回响应数据
     * 获取图书列表
     */
    @RequestMapping("/getBookListByPage")
    public Result getBookList(PageRequest request, HttpSession session) {
        log.info("获取当前页图书信息:request : {}",request);
//        UserInfo userInfo = (UserInfo)session.getAttribute(SessionContent.USER_SESSION_KEY);
////        用户信息为空,说明用户未登录
//        if(userInfo==null){
//            return Result.nologin("用户未登录");
//        }
//        用户信息存在,显示图书列表
        PageResult<BookInfo> booklistdata= bookService.getBookListByPage(request);
        return Result.success(booklistdata);
    }
    /**
     * 修改图书
     */
    @RequestMapping(value="/update",produces="application/json")
    public Result updateBookById(BookInfo bookInfo, HttpSession httpSession){
        log.info("修改图书信息:{}",bookInfo);
        UserInfo userinfo =(UserInfo)httpSession.getAttribute(SessionContent.USER_SESSION_KEY);
        //        用户信息为空,说明用户未登录
        if(userinfo==null){
            Result result = Result.fild("id不存在");
            return result;
        }
        try{
            Integer i= bookService.updateBookById(bookInfo);
            if(i>0){
//                修改成功
                return Result.success(bookInfo);
            }
        }catch (Exception e){
            log.error("修改图书失败 : ",e);
        }
        return Result.fild("修改图书失败!");
    }
    /**
     * 根据Id获取图书信息
     */
    @RequestMapping(value="/getById",produces="application/json")
    public BookInfo getBookById(Integer id){
       log.info("根据Id查找图书: {}"+id);
        return bookService.selectBookById(id);
    }
    /**
     * 物理删除图书信息
     */
    @RequestMapping(value="/delete",produces="application/json")
    public String deleteBook(Integer id){
        log.info("删除图书Id:{}",id);
        try{
            Integer i= bookService.deleteBook(id);
            if(i>0){
                System.out.println("删除成功!");
                return "";
            }else{
                return "删除信息有误,请联系管理员!";
            }
        }catch (Exception e){
            log.error("删除图书失败 : ",e);
            return "删除图书失败: "+e.getMessage();
        }
    }
    /**
     * 批量删除图书信息
     * 通过传入id集合的方式,物理批量删除图书
     */
    @RequestMapping("/batchDelete")
    public Integer batchDelete(@RequestParam List<Integer> ids){
        log.info("批量删除图书,ids :{}",ids);
        Integer n=0;
        try {
            n= bookService.batchDelete(ids);
        }catch (Exception e){
            log.error("批量删除图书失败,e : ",e);
        }
        return n;
    }
}
